#include <bits/stdc++.h>

using namespace std;

// 位图的实现
// Bitset是一种能以紧凑形式存储位的数据结构
// Bitset(int n) : 初始化n个位，所有位都是0
// void fix(int i) : 将下标i的位上的值更新为1
// void unfix(int i) : 将下标i的位上的值更新为0
// void flip() : 翻转所有位的值
// boolean all() : 是否所有位都是1
// boolean one() : 是否至少有一位是1
// int count() : 返回所有位中1的数量
// String toString() : 返回所有位的状态
// 测试链接 : https://leetcode-cn.com/problems/design-bitset/

class Bitset
{
private:
    vector<int> set;
    int sz;
    int zeros;
    int ones;
    bool reverse;

public:
    Bitset(int n)
    {
        set.resize((n + 31) / 32, 0);
        sz = n;
        zeros = n;
        ones = 0;
        reverse = false;
    }

    // 把i这个数字加入到位图
    void fix(int i)
    {
        int index = i / 32;
        int bit = i % 32;
        if (!reverse)
        {
            // 位图所有位的状态，维持原始含义
            // 0 : 不存在
            // 1 : 存在
            if ((set[index] & (1 << bit)) == 0)
            {
                zeros--;
                ones++;
                set[index] |= (1 << bit);
            }
        }
        else
        {
            // 位图所有位的状态，翻转了
            // 0 : 存在
            // 1 : 不存在
            if ((set[index] & (1 << bit)) != 0)
            {
                zeros--;
                ones++;
                set[index] ^= (1 << bit);
            }
        }
    }

    // 把i这个数字从位图中移除
    void unfix(int i)
    {
        int index = i / 32;
        int bit = i % 32;
        if (!reverse) // 没有反转过
        {
            if ((set[index] & (1 << bit)) != 0)
            {
                ones--;
                zeros++;
                set[index] ^= (1 << bit);
            }
        }
        else // 反转过
        {
            if ((set[index] & (1 << bit)) == 0)
            {
                ones--;
                zeros++;
                set[index] |= (1 << bit);
            }
        }
    }

    // 进行反转
    // 0 -> 1, 1 -> 0
    void flip()
    {
        reverse = !reverse;
        swap(zeros, ones);
    }

    bool all()
    {
        return ones == sz;
    }

    bool one()
    {
        return ones > 0;
    }

    int count()
    {
        return ones;
    }

    string toString()
    {
        string ans;
        for (int i = 0, k = 0, number, status; i < sz; ++k)
        {
            number = set[k]; // 第 k 个数
            for (int j = 0; j < 32 && i < sz; ++i, ++j)
            {
                status = (number >> j) & 1;
                status ^= (reverse ? 1 : 0);
                ans += (status ? "1" : "0");
            }
        }
        return ans;
    }
};